0장. 한눈에 보기

출처: 『RAG 마스터: 랭체인으로 완성하는 LLM 서비스』(브라이스 유·조경아·박수진·김재웅 지음, 프리렉 2025) | 공식: www.langchain.com

코드는 분위기만 — pip install·embed_query·| 같은 말은 몰라도 됩니다. 표의 '비유'와 '위험'만 봐도 충분해요.

이 책 큰 그림 5가지만

  1. LLM(AI 언어 모델)은 똑똑하지만 자기가 배운 것 밖은 모른다. 최신 소식도, 우리 회사 문서도 모른다.
  2. 그래서 답하기 전에 필요한 문서를 먼저 찾아다 손에 쥐여 주는 방식이 RAG다. 찾아서(검색) 보태서(증강) 답한다(생성).
  3. 문서를 찾으려면 글을 숫자 묶음으로 바꿔야 한다. 그 숫자 묶음이 임베딩이고, 숫자끼리 비슷한 정도로 "비슷한 글"을 찾는다.
  4. 이 모든 부품(문서 자르기·숫자 변환·저장·검색·답 생성)을 레고처럼 끼워 맞추는 도구가 랭체인이다.
  5. 그래서 RAG는 한 줄로 흐른다. 문서 → 잘게 자르기 → 숫자로 바꾸기 → 창고에 저장 → 질문 들어오면 비슷한 조각 꺼내기 → 그걸 보고 답하기. 이 한 줄을 외우면 책 전체가 보인다.

이 0장은 책 본문에 나오는 어려운 말을 미리 풀어 둔 곳이다.

뒤 장에서 막히면 여기로 돌아오면 된다.

용어집(0절)과 개념 척추가 전부다. 천천히 읽으면 된다.


0. 먼저 알아둘 말 (용어집)

이 절은 책 전체 용어의 단일 출처다.

본문 어디서 어려운 말이 나와도, 그 뜻은 전부 여기 적혀 있다.

각 용어는 [한 문장 뜻 + 일상비유 + 한 줄 예] 3종으로 적었다.


LLM(대규모 언어 모델, large language model)

한 문장 뜻 — 방대한 글을 미리 읽어 두고, 사람 말을 알아듣고 새 글을 써 주는 AI 모델.

일상비유 — 책을 엄청 많이 읽은 박학다식한 친구. 단, 그 친구가 책을 덮은 그 날까지의 내용만 안다. 어제 뉴스는 모른다.

한 줄 예 —

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# "안녕하세요!" 라고 말 걸면 답을 써 주는 AI
llm = OpenAI()          # GPT 같은 언어 모델 하나 불러옴
llm.invoke("안녕하세요!")  # → 모델이 답 문장을 생성

RAG(검색 증강 생성, Retrieval-Augmented Generation)

한 문장 뜻 — 답하기 전에 관련 문서를 먼저 검색해, 그 내용을 보태(증강) 더 정확한 답을 생성하는 방식.

일상비유 — 시험 볼 때 머릿속 기억만 쥐어짜는 게 아니라, 책을 펴서 해당 페이지를 찾아 보고 답을 쓰는 오픈북 시험. 찾아보니까 틀릴 일이 줄어든다.

한 줄 예 —

# 준비한 흐름에 실제 입력을 넣어 결과를 확인합니다.
docs = retriever.invoke(question)  # 1) 질문에 맞는 문서를 찾고
answer = llm.invoke(question + docs)  # 2) 그 문서를 보태 답을 만든다

임베딩(embedding)

한 문장 뜻 — 글(단어·문장·문서)을 AI가 다룰 수 있는 숫자 묶음(벡터)으로 바꾸는 일.

일상비유 — 사람마다 키·몸무게·나이를 숫자로 적은 신상카드. 글도 이렇게 숫자 카드로 바꿔 두면, 카드끼리 비교해 "비슷한 글"을 찾을 수 있다.

한 줄 예 —

# "저는 배가 고파요" → [-0.016, -0.021, 0.015, ...] 숫자 묶음으로 변환
# 문장이나 문서를 의미 벡터로 바꾸는 임베딩 단계를 준비합니다.
vec = embeddings.embed_query("저는 배가 고파요")

벡터(vector)

한 문장 뜻 — 숫자 여러 개를 한 줄로 늘어놓은 묶음. 임베딩의 결과물이 바로 이 모양이다.

일상비유 — 좌표. "가로 3, 세로 5" 처럼 숫자 몇 개로 한 점의 위치를 콕 집듯, 글의 의미도 숫자 묶음으로 한 점을 찍는다.

한 줄 예 —

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
vec = [1, 0.3, 0.5, 2]  # 숫자 4개짜리 벡터 한 개

벡터DB / 벡터 저장소(vector database / vector store)

한 문장 뜻 — 임베딩으로 만든 숫자 묶음(벡터)을 잔뜩 보관하고, "이거랑 비슷한 거 찾아줘"를 빠르게 해 주는 데이터 창고.

일상비유 — 신상카드를 키순·나이순으로 잘 정리해 둔 캐비닛. "나랑 비슷한 사람" 카드를 순식간에 꺼내 준다.

한 줄 예 —

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 비슷한 벡터를 찾아 주는 전용 창고 (Chroma, FAISS 등)
store.add(vectors)   # 숫자 묶음들을 저장
store.search(query)  # 질문과 비슷한 것 꺼내기

코사인 유사도(cosine similarity)

한 문장 뜻 — 두 숫자 묶음(벡터)이 얼마나 같은 방향을 보는가로 "얼마나 비슷한지"를 -1~1 점수로 재는 방법.

일상비유 — 두 사람이 가리키는 손가락 방향. 같은 곳을 가리키면 1(매우 비슷), 직각이면 0, 정반대면 -1.

한 줄 예 —

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 1에 가까울수록 두 글의 의미가 비슷하다
score = cos_sim(vec1, vec2)  # 예: 0.82 → 꽤 비슷

청크 / 텍스트 분할(chunk / text splitting)

한 문장 뜻 — 긴 문서를 검색하기 좋은 적당한 크기 조각으로 잘라 놓는 일. 잘린 한 조각이 청크다.

일상비유 — 두꺼운 책을 통째로 복사기에 넣을 순 없으니, 페이지별로 찢어 분류함에 꽂는 것. 나중에 필요한 페이지만 쏙 뽑기 쉽다.

한 줄 예 —

# 긴 글을 여러 조각(청크)으로 자른다
# 검색이나 요약에 쓸 원본 문서를 읽어 옵니다.
chunks = splitter.split_text(long_document)

문서 로더(document loader)

한 문장 뜻 — PDF·웹페이지·CSV 같은 바깥 파일을 읽어 들여 랭체인이 다룰 수 있는 형태로 바꿔 주는 도구.

일상비유 — 여러 나라 콘센트를 한 모양으로 맞춰 주는 멀티 어댑터. 파일이 PDF든 웹이든, 들어오면 같은 모양으로 통일해 준다.

한 줄 예 —

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
loader = PyPDFLoader("문서.pdf")  # PDF를 읽어 들임
docs = loader.load()              # 표준 형태의 문서로 변환

검색기(retriever)

한 문장 뜻 — 질문이 들어오면 창고(벡터DB)에서 가장 관련 있는 문서 조각을 찾아 꺼내 오는 부품.

일상비유 — 도서관 사서. "이 주제 책 어디 있어요?" 물으면 서가에서 딱 맞는 책을 찾아다 준다.

한 줄 예 —

# 질문과 가장 비슷한 문서 조각들을 꺼내 옴
# 준비한 흐름에 실제 입력을 넣어 결과를 확인합니다.
docs = retriever.invoke("환불은 어떻게 하나요?")

랭체인(LangChain)

한 문장 뜻 — LLM으로 앱을 만들 때, 모델·검색기·메모리 같은 부품을 조립식으로 끼워 쓰게 해 주는 오픈소스 프레임워크.

일상비유 — 레고. 바퀴·문·창문이 규격이 맞아 끼우기만 하면 자동차가 되듯, 정해진 부품을 끼우면 AI 앱이 된다.

한 줄 예 —

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
import langchain  # LLM 앱 조립 도구 불러오기

체인(chain)

한 문장 뜻 — 여러 작업(프롬프트 → 모델 → 정리)을 순서대로 연결한 하나의 작업 흐름.

일상비유 — 컨베이어 벨트. 재료를 올리면 자르고→굽고→포장하는 단계를 차례로 거쳐 완성품이 나온다.

한 줄 예 —

# 프롬프트 → 모델 → 출력 정리를 한 줄로 연결
chain = prompt | model | parser   # 이 | 가 "연결"이라는 뜻
# 준비한 흐름에 실제 입력을 넣어 결과를 확인합니다.
chain.invoke({"topic": "더블딥"})

프롬프트 / 프롬프트 템플릿(prompt / prompt template)

한 문장 뜻 — 모델에게 건네는 지시문이 프롬프트. 빈칸을 둬서 매번 값만 갈아 끼우게 만든 틀이 프롬프트 템플릿.

일상비유 — 빈칸 있는 양식 편지. "주제 ____에 대해 설명해 줘"의 빈칸에 '더블딥'만 끼우면 편지가 완성된다.

한 줄 예 —

# {topic} 자리에 나중에 값이 들어가는 틀
# 모델에게 어떤 역할과 입력을 줄지 프롬프트 틀을 만듭니다.
prompt = ChatPromptTemplate.from_template("주제 {topic}에 대해 짧게 설명해 주세요.")

토큰(token)

한 문장 뜻 — 모델이 글을 처리할 때 쓰는 잘게 쪼갠 글 조각 단위. 비용과 길이 한도가 이 단위로 매겨진다.

일상비유 — 글을 음절처럼 잘게 나눈 낱개. 택시 미터기가 거리로 요금을 매기듯, 모델은 토큰 수로 요금과 길이를 잰다.

한 줄 예 —

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 만들 답의 최대 길이를 토큰 수로 제한
llm = OpenAI(max_tokens=100)  # 100조각까지만 생성

온도(temperature)

한 문장 뜻 — 모델 답의 자유분방함을 0~1로 조절하는 손잡이. 낮으면 또박또박 일관, 높으면 톡톡 튀게.

일상비유 — 라디오 다이얼. 낮게 맞추면 또렷한 정석 방송, 높이면 잡음 섞인 변칙 방송.

한 줄 예 —

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
llm = OpenAI(temperature=0.0)  # 매번 거의 같은 답 (일관)
llm = OpenAI(temperature=0.9)  # 매번 다른 답 (창의적)

파인튜닝(fine-tuning, 미세 조정)

한 문장 뜻 — 모델 자체를 우리 데이터로 추가 훈련시켜 특정 분야에 맞추는 일. RAG의 대안이지만 비용이 크다.

일상비유 — 신입을 한 달 재교육해 우리 회사 일을 외우게 하는 것. 효과는 있지만 시간·돈이 든다. RAG는 대신 "필요할 때 매뉴얼을 펴 보게" 하는 쪽이다.

한 줄 예 —

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# (개념) 모델을 우리 데이터로 다시 학습 — 비싸고 오래 걸림
fine_tune(model, our_data)   # RAG는 이 대신 "검색해서 보여주기"를 택함

멀티모달(multimodal)

한 문장 뜻 — 글뿐 아니라 이미지·차트·표·음성 등 여러 형태의 데이터를 함께 다루는 방식.

일상비유 — 글만 읽는 게 아니라 사진·도표까지 같이 보는 것. 쇼핑할 때 상품 설명(글)과 상품 사진(이미지)을 함께 보면 더 잘 고른다.

한 줄 예 —

# 아래 예제는 핵심 흐름만 짧게 보여 줍니다.
# 글 + 이미지를 같이 입력으로 받는 RAG
answer = mllm.invoke(question, image)  # 텍스트와 이미지 동시 사용

개념 척추

여기 7개는 책 전체를 관통하는 큰 줄기다.

각각 ①망가지는 장면 ②일상비유 ③비유·코드·위험 표 ④한 문장 정의 순서다.


척추 1 — LLM은 자기가 배운 것 밖을 모른다

망가지는 장면

똑똑한 AI에게 "우리 회사 환불 규정 알려줘"라고 물었더니, 그럴듯하지만 틀린 답을 술술 지어냈다.

"어제 발표된 신제품은?" 하니 "그런 제품 없습니다." 한다.

AI가 멍청해서가 아니다. 그 AI는 학습을 멈춘 그 날까지의 글만 안다. 우리 회사 문서도, 어제 뉴스도 배운 적이 없다.

일상비유

책을 1만 권 읽은 박학다식한 친구. 단, 작년에 책을 덮었다.

올해 일은 모르고, 우리 집 가계부는 더더욱 모른다. 모르는 걸 물으면 아는 척 둘러댄다.

비유 코드 위험
작년에 독서 멈춘 친구 llm.invoke("어제 뉴스는?") 최신 정보 → 모름 또는 지어냄
우리 집 가계부는 못 봄 llm.invoke("우리 회사 규정은?") 사내 문서 → 모름

한 문장 정의 — LLM은 학습 시점까지의 데이터만 알기 때문에, 최신 정보나 우리만의 문서에 대해서는 한계가 있다.


척추 2 — RAG = 찾아서 보태서 답하기

망가지는 장면

LLM이 모르는 걸 지어내 곤란했던 적 있죠?

방법은 둘이다. 하나는 모델을 우리 데이터로 다시 훈련(파인튜닝)하는 것 — 비싸고 오래 걸린다.

다른 하나는 답하기 전에 필요한 문서를 찾아다 손에 쥐여 주는 것. 이게 RAG다. 훨씬 싸고, 출처가 분명하다.

일상비유

오픈북 시험. 기억만으로 쓰지 않고, 관련 페이지를 펴서 보고 답을 쓴다.

찾아본 페이지가 답의 근거가 되니, 헛소리가 줄고 "어디서 봤는지"도 댈 수 있다.

비유 코드 위험
오픈북: 페이지 찾기 docs = retriever.invoke(질문) 엉뚱한 페이지 찾으면 답도 틀림
찾은 걸 보고 답쓰기 llm.invoke(질문 + docs) 문서를 안 주면 또 지어냄

한 문장 정의 — RAG는 질문에 관련된 외부 문서를 먼저 검색해 그 내용을 보태(증강) LLM이 답을 생성하게 하는 방식으로, 파인튜닝보다 싸고 신뢰성이 높다.


척추 3 — 글을 숫자로 바꿔야 컴퓨터가 비교한다

망가지는 장면

"과일 값이 비싸다"와 "시장 물가가 올랐어요"는 사람 눈엔 비슷하다. 그런데 컴퓨터는 글자가 하나도 안 겹쳐서 "전혀 다른 글"로 본다.

글자 그대로 비교하면 의미가 비슷한 글을 영영 못 찾는다.

그래서 글을 숫자 묶음으로 먼저 바꾼다. 이게 임베딩이다.

일상비유

사람마다 키·나이·취향을 숫자 신상카드로 적어 두는 것.

이름이 달라도 카드 숫자가 비슷하면 "성향이 비슷한 사람"임을 안다. 글도 숫자 카드로 바꾸면 의미가 비슷한지 잴 수 있다.

비유 코드 위험
글 → 숫자 신상카드 embeddings.embed_query("저는 배가 고파요") 모델이 나쁘면 카드가 엉터리
카드 숫자로 의미 비교 [-0.016, -0.021, 0.015, ...] 글자만 보면 의미 비교 불가

한 문장 정의 — 컴퓨터는 글자를 직접 이해하지 못하므로, 임베딩으로 글을 숫자 묶음(벡터)으로 바꿔야 비로소 의미의 비슷함을 계산할 수 있다.


척추 4 — 비슷한 정도는 "방향"으로 잰다

망가지는 장면

글을 숫자로 바꿨다. 그럼 두 숫자 묶음이 얼마나 비슷한지는 어떻게 점수로 매길까?

길이(크기)로 재면 곤란하다. 긴 문서와 짧은 문서는 숫자가 커지고 작아질 뿐, 의미가 다른 게 아닌데도 "다르다"고 나와 버린다.

그래서 크기 말고 가리키는 방향만 본다. 같은 곳을 보면 비슷한 거다.

일상비유

두 사람이 손가락으로 가리키는 방향. 같은 산봉우리를 가리키면, 한 명이 코앞이고 한 명이 멀리 있어도 "같은 걸 본다".

방향이 같으면 1, 직각이면 0, 정반대면 -1.

비유 코드 위험
같은 곳 가리킴(1) cos_sim(vec2, vec3) → 1.0 1에 가까울수록 비슷
직각(0)·정반대(-1) cos_sim(vec1, vec2) → 0.7 점수 낮으면 관련 없는 문서

한 문장 정의 — 코사인 유사도는 두 벡터의 크기가 아니라 방향으로 비슷한 정도를 -1~1 점수로 재므로, 문서 길이에 휘둘리지 않고 의미의 유사성을 잴 수 있다.


척추 5 — 긴 문서는 잘라야 잘 찾힌다

망가지는 장면

300쪽짜리 매뉴얼을 통째로 숫자 하나로 바꿔 저장했다. 그랬더니 "환불 규정"을 물었을 때, 책 전체가 한 덩어리로 딸려 와 정작 필요한 한 단락을 못 짚는다.

너무 크게 묶으면 검색이 뭉툭해진다.

그래서 문서를 검색하기 좋은 조각(청크)으로 미리 잘라 둔다.

일상비유

두꺼운 책을 페이지별로 찢어 분류함에 꽂는 것.

"환불" 물으면 환불 페이지 한 장만 쏙 뽑힌다. 책을 통째로 들고 오지 않는다.

비유 코드 위험
페이지별로 찢어 보관 chunks = splitter.split_text(문서) 너무 크게 자르면 검색이 뭉툭
필요한 한 장만 뽑기 조각 단위로 임베딩·저장 너무 잘게 자르면 맥락 끊김

한 문장 정의 — 긴 문서는 텍스트 분할로 적당한 크기의 청크로 잘라 저장해야, 검색기가 질문에 딱 맞는 조각만 정확히 꺼낼 수 있다.


척추 6 — RAG는 한 줄의 파이프라인이다

망가지는 장면

용어를 따로따로 외우면 머릿속이 흩어진다. "임베딩이 먼저였나, 청크가 먼저였나?"

사실 RAG는 흩어진 부품이 아니라 물 흐르듯 이어진 한 줄이다. 순서만 잡으면 전부 제자리에 꽂힌다.

크게 두 토막이다. 미리 준비하는 인덱싱, 질문이 올 때마다 도는 쿼리.

일상비유

도서관 운영. 책이 들어오면 미리 분류·정리해 서가에 꽂아 둔다(인덱싱). 손님이 물으면 그제야 찾아다 준다(쿼리).

준비를 미리 해 두니, 질문엔 빠르게 답한다.

비유 코드 위험
미리 정리(인덱싱) 문서 → 청크 → 임베딩 → 벡터DB 저장 정리를 안 하면 검색 불가
손님 응대(쿼리) 질문 → 검색기 → 비슷한 조각 → LLM 답 검색이 틀리면 답도 틀림

한 문장 정의 — RAG는 미리 문서를 잘라·숫자로 바꿔·창고에 넣는 인덱싱 과정과, 질문이 올 때 비슷한 조각을 찾아 LLM에게 답하게 하는 쿼리 과정, 두 토막이 한 줄로 이어진 파이프라인이다.


척추 7 — 랭체인은 이 부품들을 끼워 맞추는 레고다

망가지는 장면

문서 로더, 임베딩, 벡터DB, 검색기, 모델… 부품이 많다. 이걸 맨손으로 일일이 연결하면, 모델 하나 바꾸려다 코드 절반을 뜯어고치게 된다.

게다가 OpenAI를 쓰다 Gemini로 갈아타려면, API마다 호출법이 달라 처음부터 다시 짠다.

이 고생을 줄여 주는 게 랭체인이다.

일상비유

레고. 바퀴·문·엔진이 같은 규격이라 끼우기만 하면 차가 된다.

엔진(모델)만 다른 걸로 바꾸고 싶으면, 그 한 조각만 빼서 갈아 끼우면 된다. 차 전체를 다시 만들 필요가 없다.

비유 코드 위험
레고 끼우기 chain = prompt \| model \| parser 부품 규격 안 맞으면 안 끼워짐
엔진만 교체 ChatOpenAI()ChatMistralAI() 맨손 연결 시 모델 교체가 큰 공사

한 문장 정의 — 랭체인은 문서 로더·임베딩·벡터DB·검색기·모델 같은 부품을 표준 규격으로 감싸 체인으로 조립하게 해 주는 프레임워크라, 부품 하나를 갈아 끼우기 쉽다.


한 걸음 더 ▸ (지금 몰라도 됨)

지금은 큰 줄기 하나면 충분하다. RAG는 "찾아서 보태서 답한다"가 전부다.

임베딩 모델을 뭘 쓸지, 청크를 얼마나 잘게 자를지, 검색을 얼마나 정교하게 할지 — 이런 튜닝은 더 깊은 주제다. 지금은 한 줄 흐름만 들고 가면 된다.

멀티모달(이미지·표까지 다루기)도 마찬가지다. 글만 다루는 기본 RAG를 먼저 익히면, 거기에 이미지를 얹는 것뿐이다.


사이드박스 — 이름의 뜻 한 조각 (흥미용)

RAG = Retrieval(검색) + Augmented(증강·보탬) + Generation(생성). 이름 자체가 "검색해서 보태서 생성"이라는 순서를 그대로 담았다.

랭체인(LangChain)은 Language(언어) + Chain(사슬·연결). "언어 모델을 사슬처럼 잇는다"는 뜻이다. 외워 둘 필요는 없다.


부록 박스 — 코랩 한 조각 (참고용, 건너뛰어도 됨)

이 책 실습은 구글 코랩에서 돌린다. 코랩은 브라우저에서 바로 파이썬을 돌리는 무료 공간이라, 내 컴퓨터에 아무것도 안 깔아도 된다.

코드 앞의 !(느낌표)는 "리눅스 명령을 실행하라"는 표시고, pip install은 "필요한 도구를 내려받아 깔아라"는 뜻이다. 지금은 코드 줄을 외울 필요 없이, 표의 비유만 따라가도 충분하다.


더 학습할 자료

검증된 외부 자료(Tier 1 공식). 책에는 클릭 링크가 없어 여기 모았다.

모델·가격은 수시로 바뀐다. 책의 gpt-4o·Claude 3.5·Gemini 표기는 2025년 기준 예시이니, 실제로 쓸 땐 공식 모델 목록을 확인하라: OpenAI·Anthropic·Google. (검증 2026-05-21)


다음 장 예고

다음 1장에서는 이 부품들을 끼워 맞추는 도구, 랭체인이 정확히 무엇이고 어떻게 생겼는지 본다.

지금 0장 용어와 척추만 머리에 있으면 충분하다. 나머지는 1장에서 천천히 다룬다.

난이도
에피소드
질문
카드를 로딩 중...
답변

클릭하거나 Space를 눌러 뒤집기

0 / 0
학습 진도 0%
이동   Space 뒤집기   R 셔플